#ifndef DSPSIMULATOR_LEXER_H
#define DSPSIMULATOR_LEXER_H

#include <memory>
#include <simulatorV1/lexer/token.h>
#include <simulatorV1/lexer/keywords.h>
#include <simulatorV1/type/type.h>

class Lexer {
private:
    std::unique_ptr<Keywords> m_keywords;   // 关键字表
    std::string m_buffer;   // 命令缓冲区，用户输入命令后，将命令加载到该缓冲区中，然后进行词法分析
    u64 m_curIndex; // 下一个需要分析的字符偏移量
    char m_ch; // 当前正在分析的字符

    /**
    * 该函数用于扫描下一个字符。调用该函数后，返回m_curIndex指向的字符，并将m_curIndex加1
    * @return m_curIndex指向的字符
    */
    char scanner();
public:
    Lexer();

    /**
     * 将用户输入的命令加载到缓冲区中
     * @param buffer 用户输入的命令
     */
    void loadBuffer(std::string buffer);

    /**
     * @return 获取下一个token并返回该token
     */
    std::shared_ptr<Token> tokenize();
};

#endif //DSPSIMULATOR_LEXER_H
